// Model类的头文件
#ifndef MODEL_H
#define MODEL_H
// #include "core_lib_export.h"

#include <string>
#include "vector3d.h"
#include "cell.h"
#include "material.h"

// 从文件加载向量和单元格的模型。
class Model
{
  private:
    std::string filename;             // 要加载的文件名
    bool isSTL;                       // 如果文件是STL文件(.stl扩展名)则为真
    std::vector<Vector3D> vertices;   // 从文件加载的顶点std::vector
    std::vector<Material> materials;  // 从文件加载的材料std::vector
    std::vector<Cell> cells;          // 从文件加载的单元格std::vector

    // 解析顶点字符串
    void parseVertex(std::string line);

    // 解析材料字符串
    void parseMaterial(std::string line);

    // 解析单元格字符串
    void parseCell(std::string line);

    // 杂项函数
    // 将字符串分割成以空格分隔的单词
    std::vector<std::string> splitString(std::string line);

    // 如果文件具有该扩展名则返回true。
    bool isExtension(const std::string& str, const std::string& suffix);

  public:
    Model() = default;
    ~Model() = default;
    
    // 从文件加载模型
    Model(std::string filename);

    // 访问器
    // 获取模型的文件名
    std::string getFilename();

    // 如果模型是.STL文件则返回true
    bool getIsSTL();

    // 以std::vector形式获取材料列表
    std::vector<Material> getMaterials();

    // 以std::vector形式获取顶点列表
    std::vector<Vector3D> getVertices();

    // 以std::vector形式获取单元格列表
    std::vector<Cell> getCells();

    // 获取材料总数
    int getMaterialCount();

    // 获取顶点总数
    int getVertexCount();

    // 获取单元格总数
    int getCellCount();

    // 返回一个包含单元格总数的字符串,以及每个单元格的ID和类型
    std::string getCellList();

    // 根据顶点获取模型的中心
    Vector3D getCentre();

    // 杂项函数
    // 将当前模型复制到另一个文件(只是复制输入文件的内容)
    void copyToFile(std::string filename);

    // 将当前模型保存到文件
    void saveToFile(std::string filename);
};

#endif /* MODEL_H */